<?php
/**
* Класс-модель регистрации пользователей
* 
* @author Larein
* @version 1.0.0 / 28.07.2011
*/
class RegistrationForm extends AccountPending
{
    /**
    * @var string повторение пароля
    */
    public $passwordConfirm;
    /**
    * @var string проверочный код (каптча)
    */
    public $verifyCode;
    /**
    * @var boolean согласие с правилами сервера
    */
    public $agreeToTerms=false;
    /**
    * @var int время создания аккаунта (timestamp)
    */
    public $create_time;
     
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    /**
    * Возвращает массив с правилами валидации пользователя
    */
    public function rules()
    {
        return array(
            // логин
            array('name', 'required', 'message'=>Yii::t('models', 'Вы не ввели логин')),
            array('name', 'length', 'min'=>4, 'max'=>50, 'tooShort'=>Yii::t('models', 'Логин не может быть короче 4 символов'), 'tooLong'=>Yii::t('models', 'Логин не может быть длиннее 50 символов')),
            array('name', 'match', 'pattern'=>'/^[A-z,0-9_-\s]+$/u', 'message'=>Yii::t('models', 'Ваш логин может содержать только латинские буквы, цифры а также символы _ и -')),
            array('name', 'unique', 'message'=>Yii::t('models', 'Введенный Вами логин уже занят')),
            // пароль
            array('password', 'required', 'message'=>Yii::t('models', 'Вы не ввели пароль')),
            array('password', 'length', 'min'=>5, 'max'=>50, 'tooShort'=>Yii::t('models', 'Пароль не может быть короче 5 символов'), 'tooLong'=>Yii::t('models','Пароль не может быть длиннее 50 символов')),
            array('password', 'match', 'pattern'=>'/^[A-Z,a-z,0-9_-\s]+$/u', 'message'=>Yii::t('models', 'Ваш пароль может содержать только латинские буквы, цифры а также символы _ и -')),
            array('password', 'compare', 'compareAttribute'=>'name', 'operator'=>'!=', 'message'=>Yii::t('models', 'Ваш пароль не может совпадать с логином')),
            // повторение пароля
            array('passwordConfirm', 'compare', 'compareAttribute'=>'password', 'message'=>Yii::t('models', 'Вы не смогли повторить пароль')),
            // контрольный вопрос
            array('squestion', 'required', 'message'=>Yii::t('models', 'Вы не ввели контрольный вопрос')),
            array('squestion', 'length', 'min'=>5, 'max'=>100, 'tooShort'=>Yii::t('models', 'Контрольный вопрос не может быть короче 5 символов'), 'tooLong'=>Yii::t('models', 'Контрольный вопрос не может быть длиннее 100 символов')),
            // ответ на контрольнйы вопрос
            array('answer', 'required', 'message'=>Yii::t('models', 'Вы не ввели ответ на контрольный вопрос')),
            array('answer', 'length', 'min'=>5, 'max'=>100, 'tooShort'=>Yii::t('models', 'Ответ на контрольный вопрос не может быть короче 5 символов'), 'tooLong'=>Yii::t('models', 'Ответ на контрольный вопрос не может быть длиннее 100 символов')),
            // email адрес
            array('email', 'required', 'message' => Yii::t('models', 'Вы не ввели адрес электронной почты (Email)')),
            array('email', 'email', 'message'=> Yii::t('models', 'Вами введен некорректный адрес электронной почты (Email)')),
            array('email', 'length', 'max'=>50, 'tooLong' => Yii::t('models', 'Ваш адрес электронной почты (Email) не может быть длиннее 50 символов')),     
            array('email', 'unique', 'message'=>Yii::t('models', 'Введенный Вами адрес электронной почты (Email) уже используется')),
            array('email', 'filter', 'filter'=>'mb_strtolower'),  
            // проверочный код (каптча)
            array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd'), 'message'=>Yii::t('models', 'Вы не смогли ввести правильный код с изображения')),
            // согласие с правилами сервера
            array('agreeToTerms', 'boolean', 'trueValue'=>'1', 'falseValue'=>'0', 'message'=>Yii::t('models', 'Данное поле должно содержать значение true или false')),
            array('agreeToTerms', 'in', 'allowEmpty'=>false, 'range'=>array(true), 'message'=>Yii::t('models', 'Вы не приняли правила сервера')),
        );        
     }
    
    /**
    * Возвращает массив меток формы 
    */
     public function attributeLabels()
     {
        return array(
            'name'=>Yii::t('models', 'Логин'),
            'password'=>Yii::t('models', 'Пароль'),
            'passwordConfirm'=>Yii::t('models', 'Повторите пароль'),
            'squestion'=>Yii::t('models', 'Контрольный вопрос'),
            'answer'=>Yii::t('models', 'Ответ на вопрос'),
            'email'=>Yii::t('models', 'Электронная почта (E-mail)'),
            'verifyCode'=>Yii::t('models', 'Проверочный код'),
            'agreeToTerms'=>Yii::t('models', 'Я согласен с правилами сервера'),             
        );
     }      

     //----------------------------------------------------------
     // не приведено в порядок
     
     /**
     * отправляем письмо с ключом активации
     */
     public function sendRegistrationEmail() 
     {
        $activationLink = Yii::app()->controller->createAbsoluteUrl("/registration/activation/", array('email' => $this->email, 'key' => $this->actcode)); 

        Yii::import('application.extensions.mailer.EMailer');
                        
        $mail = new EMailer();
            $mail->langcode = 'ru';  
            $mail->CharSet = 'UTF-8';                                 
            $mail->From = Yii::app()->params['adminEmail']; 
            $mail->FromName = Yii::app()->name;
            $mail->AddAddress($this->email);
            $mail->Subject = Yii::t('accounts', 'Подтверждение регистрации на') . ' ' . Yii::app()->name;
            $mail->Body=Yii::app()->controller->renderPartial('application.views.email._registration_email_body', array( 'name' => $this->name, 'password' => $this->passwordConfirm, 'activationLink' => $activationLink),true);        
                        
        return $mail->Send();
     }  
     
     /**
     * активируем аккаунт      
     */
     public function activateAccount($email, $key)
     {
         if($email==null || $key == null)
         {
             $this->addError('', Yii::t('accounts', 'Не указаны данные необходимые для активации аккаунта'));
             return;
         }
         
         $record = $this->findByAttributes(array('email'=>$email), array('limit'=>1));
         
         if($record == null)
         {
             $this->addError('', Yii::t('accounts', 'Аккаунт не найден'));
             return;
         }
         
         if($record->actcode == 0)
         {
            $this->addError('', Yii::t('accounts', 'Аккаунт уже активирован')); 
            return;  
         }
         
         if ($record->actcode != $key)
         {
            $this->addError('',Yii::t('accounts', 'Неверный ключ активации'));  
            return; 
         }
         
            $record->actcode = 0; 
            $record->saveAttributes(array('actcode'));
         return;
     }
}